package com.wfg.nettydemo.io.nio;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.LinkedList;
import java.util.concurrent.TimeUnit;

/**
 * @author wufagang
 * @description
 * @date 2022年08月03日 21:09
 */
public class NIOServer {
    public static void main(String[] args) throws IOException {
        LinkedList<SocketChannel> clients = new LinkedList<>();
        ServerSocketChannel ss = ServerSocketChannel.open();
        ss.bind(new InetSocketAddress(9090));
        ss.configureBlocking(false); //重点，设置非阻塞， 如果是true 退化成阻塞
        while (true){
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            /**
             *accept 调用内核了：
             * 1。没有客户端连接进来，返回值？ 在bio中一直阻塞，但是在NIo，不阻塞，返回-1 null
             * 如果有客户端有连接，accept 返回端是这个客户端端 fd5 client object
             * NONblocking 就是代码能往下走，只不过有不同的情况
             */
            SocketChannel client = ss.accept(); //不会阻塞， 无连接返回-1 null

            if(client == null){
                System.out.println("无连接");
            }else {
                client.configureBlocking(false);  //客户端设置非阻塞
                int port = client.socket().getPort();
                System.out.println("client...port: "+ port);
                clients.add(client);
            }
            //遍历客户端能不能读写数据
            ByteBuffer buffer = ByteBuffer.allocate(4096); //可以在堆里
            for (SocketChannel c : clients ) {
                int num = c.read(buffer); //client.configureBlocking(false) 也不会阻塞
                if(num>0){
                    buffer.flip();
                    byte[] bytes = new byte[buffer.limit()];
                    buffer.get(bytes);
                    String s = new String(bytes);
                    System.out.println(c.socket().getPort() + " : " + s);
                    buffer.clear();
                }
            }
        }
    }
}
